package cn.sdxx.qddata.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * 专门处理JwtFilter抛出异常的Controller
 *  * Shiro使用JWT的时候在Filter里做身份验证，然后在里面catch捕获并抛出了自定义异常。我们这边是用的RestControllerAdvice做统一异常处理，然后这个异常并没有被RestControllerAdvice所拦截到
 *  * 原因：
 *  * 请求进来 会按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的顺序调用
 *  * 当controller返回异常，会按照controller -> aspect -> controllerAdvice -> interceptor -> filter来依次抛出
 *  * 这种Filter发生的404、405、500错误都会到Spring默认的异常处理。
 *  * 如果你在配置文件配置了server.error.path的话，就会使用你配置的异常处理地址，如果没有就会默认使用/error来作为发生异常的处理地址。
 *  * 如果想要替换默认的非Controller异常处理直接实现Spring提供的ErrorController接口就行了
 *  * 解决方案：
 *  * 新建一个ErrorControllerImpl 实现ErrorController 把ErrorPath 指向error 再写一个方法把Error抛出 然后Controller全局统一异常处理RestControllerAdvice就能捕获到异常了
 */
@RestController
public class ErrorControllerImpl implements ErrorController {

    @RequestMapping("/error")
    public void handleError(HttpServletRequest request) throws Throwable {
        if (request.getAttribute("javax.servlet.error.exception") != null) {
            throw (Exception) request.getAttribute("javax.servlet.error.exception");
        }
    }
}